#include <iostream>
#include <string>
#include <unistd.h>

#include <ctime>
#include<cstring>
#include"lockGuard.hpp"
#include"Thread.hpp"
using namespace std;

int tickets=100;//全局变量  临界资源

pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;//全局锁
//抢票
void threadRoutine(void* args)
{
    string name=static_cast<const char*>(args);
    while (true)
    {
        LockGuard lockguard(&mutex);
        //pthread_mutex_lock(&mutex);//加锁
        if(tickets>0)
        {
            usleep(2000);
            cout<<name<<"get a ticket:"<<tickets--<<endl;//临界区（访问临界资源的代码段）
            // pthread_mutex_unlock(&mutex);//解锁
        }
        else
        {
            //pthread_mutex_unlock(&mutex);//解锁
            break;
            

        }
    }
    //模拟抢票后的操作
    usleep(13);
    
}
void threadRun(void* args)
{
    std::string message=static_cast<const char*>(args);
    int cnt=5;
    while (cnt--)
    {
        cout<<"我是一个线程，"<<message<<endl;
        sleep(1);
    }
}
int main()
{
    Thread t1(1, threadRoutine, (void *)"hellobit1");
    Thread t2(2, threadRoutine, (void *)"hellobit2");
    Thread t3(3, threadRoutine, (void *)"hellobit3");
    Thread t4(4, threadRoutine, (void *)"hellobit4");

    t1.run();
    t2.run();
    t3.run();
    t4.run();

    t1.join();
    t2.join();
    t3.join();
    t4.join();
    // Thread t1(1,threadRun,(void*)"hello");
    // cout<<"thread name:"<<t1.threadname()<<",thread id:"<<t1.threadid()<<",thread status:"<<t1.status()<<endl;
    // t1.run();
    // cout<<"thread name:"<<t1.threadname()<<",thread id:"<<t1.threadid()<<",thread status:"<<t1.status()<<endl;
    // t1.join();
    // cout<<"thread name:"<<t1.threadname()<<",thread id:"<<t1.threadid()<<",thread status:"<<t1.status()<<endl;
    return 0;

}
// int main()
// {
//     pthread_t tids[4];
//     int n=sizeof(tids)/sizeof(tids[0]);
//     for(int i=0;i<n;i++)
//     {
//         char* name=new char[64];
//         snprintf(name,64,"thread-%d",i+1);
//         pthread_create(tids+i,nullptr,threadRoutine,name);
//     }
//     for(int i=0;i<n;i++)
//     {
//         pthread_join(tids[i],nullptr);
//     }
//     return 0;
// }
// void* threadRoutine(void* args)
// {
//     //pthread_detach(pthread_self());
//     string name=static_cast<const char* > (args);
//     int cnt=5;
//     while(cnt)
//     {
//         cout<<name<<":"<<cnt--<<endl;
//         sleep(1);
//     }
//     return nullptr;
// }
// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid,nullptr,threadRoutine,(void*)"thread 1");
//     pthread_detach(tid);
//     sleep(1);
//     int n=pthread_join(tid,nullptr);
//     if(n!=0)
//     {
//         cerr<<"thread erro:"<<n<<strerror(n)<<endl;
//     }
//     //sleep(10);
//     return 0;
// }